perm filename POTCAL.SAI[SYS,HE] blob sn#060099 filedate 1974-05-24 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "POTCAL"	COMMENT	 POT CALIBRATION ROUTINE
C00005 00003	IF TOT<2 THEN CALL(0,"EXIT")
C00007 ENDMK
C⊗;
BEGIN "POTCAL"	COMMENT	 POT CALIBRATION ROUTINE;

EXTERNAL PROCEDURE SPWON(INTEGER TICK; REFERENCE INTEGER LAB);
EXTERNAL PROCEDURE SPWOFF;
EXTERNAL PROCEDURE CALPOT;
EXTERNAL INTEGER STATUS, STATE, POT, SSERVO;
EXTERNAL REAL CREF, SREF, P1, P2, P3, P4, P5, P6, P7, P8;

REQUIRE "HELIB[1,3]" LIBRARY;

DEFINE DEG="180/3.14159", CR="'15&'12";
SAFE REAL ARRAY X, Y, DEV[1:100];
INTEGER TOT, I, J, CAMERA, NUMB;
REAL A, B;

SETFORMAT(0,8);
OUTSTR("POT: 1-C FOCUS, 2-C TILT, 3-C PAN, 4-S FOCUS, 5-S ZOOM, 6-S TILT"&
	CR&"7-S PAN : ");
NUMB ← CVD(INCHWL);
CAMERA ← NUMB>3;
TOT ← 0;
WHILE TRUE DO
	BEGIN "GETLOP"
	STRING STR;
	OUTSTR("VALUE=");
	STR ← INCHWL;
	IF ¬LENGTH(STR) THEN DONE;
	TOT ← TOT+1;
	X[TOT] ← REALSCAN(STR,I)*(CASE NUMB-1 OF (1,DEG,DEG,1,1,DEG,DEG));
	STATE ← STATUS ← 0;
	DO	BEGIN "READ"
		IF CAMERA THEN
			BEGIN "SIERRA"
			STATE ← 0;
			POT ← -1;
			SPWON(0,SSERVO);
			WHILE ¬STATE DO;
			SPWOFF;
			IF ¬(STATE LAND '1) THEN STATE ← 0 ELSE
				OUTSTR(CVOS(STATE));
			END "SIERRA" ELSE BEGIN "COHU"
			CALPOT;
			IF ¬(STATUS LAND  '100077) THEN STATUS←0 ELSE
				OUTSTR(CVOS(STATUS));
			END "COHU";
		IF STATUS∨STATE THEN OUTSTR("-ERR"&CR);
		END "READ" UNTIL ¬STATE∧¬STATUS;
	Y[TOT] ← (CASE NUMB-1 OF (P1,P2,P3,P6,P7,P5,P4))*(IF CAMERA
		THEN SREF ELSE CREF);
	END "GETLOP";
IF TOT<2 THEN CALL(0,"EXIT");
IF TOT=2 THEN
	BEGIN "SOLVE"
	A ← (X[2]-X[1])/(Y[2]-Y[1]);
	B ← X[1]-A*Y[1];
	END "SOLVE" ELSE BEGIN "LEAST"
	REAL SXY, SX, SY, SYQ;
	SXY ← SX ← SY ← SYQ ← 0;
	FOR I←1 STEP 1 UNTIL TOT DO
		BEGIN "SUM"
		SX ← SX+X[I];
		SY ← SY+Y[I];
		SXY ← SXY+X[I]*Y[I];
		SYQ ← SYQ+Y[I]↑2;
		END "SUM";
	A ← (SXY-SX*SY)/(SYQ-SY↑2);
	B ← SX-A*SY;
	END "LEAST";
FOR I ← 1 STEP 1 UNTIL TOT DO DEV[I] ← A*Y[I]+B-X[I];
OUTSTR("EQUATION IS "&CVF(A)&"*POT + "&CVF(B)&" = VALUE"&CR);
OUTSTR(CR&"POT		VALUE		DEVIATION"&CR);
FOR I←1 STEP 1 UNTIL TOT DO OUTSTR(CVF(Y[I])&"	"&CVF(X[I])&"	"&
	CVF(DEV[I])&CR);
INCHWL;
END "POTCAL";